/*
 * @Author: wangjun haodreams@163.com
 * @Date: 2024-10-20 16:14:49
 * @LastEditors: wangjun haodreams@163.com
 * @LastEditTime: 2025-08-18 10:45:43
 * @FilePath: \golib\charset\chartset.go
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
package charset

import (
	"io"
	"os"
	"unicode/utf8"

	"golang.org/x/text/encoding/simplifiedchinese"
	"golang.org/x/text/transform"
)

/**
 * @description: gbk 转为utf8编码
 * @param {string} data
 * @return {*}
 */
func UTF8(data string) string {
	ret, _ := simplifiedchinese.GBK.NewDecoder().String(data)
	return ret
}

/**
 * @description:  utf8转为gbk编码
 * @param {string} data
 * @return {*}
 */
func GBK(data string) string {
	//ret, _ := simplifiedchinese.GBK.NewEncoder().String(data)
	ret, _, _ := transform.String(simplifiedchinese.GBK.NewEncoder(), data)
	return ret
}

// 读取GBK字节流
func GBKReader(r io.Reader) io.Reader {
	return simplifiedchinese.GBK.NewDecoder().Reader(r)
}

// 写入GBK字节流,使用时慎重，如果有乱码的中文将不能保存(必须保证没有中文乱码，建议使用GBK()函数代替)
func GBKWriterBad(w io.Writer) io.Writer {
	return simplifiedchinese.GBK.NewEncoder().Writer(w)
}

// 读取文件，自动识别编码，返回utf8编码
func ReadFile(path string) (data []byte, err error) {
	data, err = os.ReadFile(path)
	if err != nil {
		return nil, err
	}
	if utf8.Valid(data) {
		return data, nil
	}
	return simplifiedchinese.GBK.NewDecoder().Bytes(data)
}

// // 修复编码重合的问题
// func IsGBK(data []byte) bool {
// 	length := len(data)
// 	i := 0
// 	for i < length {
// 		// ASCII字符直接跳过
// 		if data[i] <= 0x7F {
// 			i++
// 			continue
// 		}

// 		// 检查是否为UTF-8多字节序列的首字节
// 		if isUTF8StartByte(data[i]) {
// 			// 计算UTF-8字符占用的字节数
// 			utf8Len := getUTF8CharLen(data[i])

// 			// 检查是否有足够的字节
// 			if i+utf8Len > length {
// 				return false // 不完整的UTF-8字符
// 			}

// 			// 验证后续字节是否符合UTF-8编码规则
// 			if isValidUTF8Sequence(data[i : i+utf8Len]) {
// 				i += utf8Len
// 				continue // 这是一个有效的UTF-8字符，继续检查下一个
// 			}
// 		}

// 		// GBK字符需要两个字节
// 		if i >= length-1 {
// 			return false // 不完整的GBK字符
// 		}

// 		// 检查是否符合GBK编码范围
// 		if data[i] >= 0x81 && data[i] <= 0xFE &&
// 			data[i+1] >= 0x40 && data[i+1] <= 0xFE &&
// 			data[i+1] != 0xF7 {
// 			return true // 找到一个符合GBK的字符对，立即返回true
// 		}

// 		// 既不是UTF-8也不是GBK，继续检查下一个字节
// 		i++
// 	}
// 	return false // 整个数据中没有找到符合GBK的字符对
// }

// // 判断是否为UTF-8多字节序列的首字节
// func isUTF8StartByte(b byte) bool {
// 	return b >= 0xC0
// }

// // 获取UTF-8字符占用的字节数
// func getUTF8CharLen(b byte) int {
// 	if b >= 0xF0 {
// 		return 4
// 	} else if b >= 0xE0 {
// 		return 3
// 	} else if b >= 0xC0 {
// 		return 2
// 	}
// 	return 1
// }

// // 验证UTF-8序列是否有效
// func isValidUTF8Sequence(data []byte) bool {
// 	length := len(data)
// 	if length == 1 {
// 		return true // ASCII字符
// 	}

// 	// 检查首字节
// 	switch length {
// 	case 2:
// 		if data[0] < 0xC2 || data[0] > 0xDF {
// 			return false
// 		}
// 	case 3:
// 		if (data[0] == 0xE0 && data[1] < 0xA0) ||
// 			(data[0] == 0xED && data[1] > 0x9F) ||
// 			(data[0] > 0xEF) {
// 			return false
// 		}
// 	case 4:
// 		if (data[0] == 0xF0 && data[1] < 0x90) ||
// 			(data[0] == 0xF4 && data[1] > 0x8F) ||
// 			(data[0] > 0xF4) {
// 			return false
// 		}
// 	default:
// 		return false // 无效长度
// 	}

// 	// 检查后续字节
// 	for i := 1; i < length; i++ {
// 		if data[i] < 0x80 || data[i] > 0xBF {
// 			return false // 后续字节必须以10开头
// 		}
// 	}

// 	return true
// }
